{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "horse_data = pd.read_csv(r\"https://raw.githubusercontent.com/obulygin/pyda_homeworks/master/statistics_basics/horse_data.csv\", header=None)\n",
    "\n",
    "horse_data.replace('?',None, inplace=True)\n",
    "\n",
    "horse_data = horse_data.iloc[:,[0,1,3,4,5,11,19,22]]\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# функция для числовой переменной\n",
    "def linear_var(variable):\n",
    "    variable = variable.astype(float)\n",
    "    print( \"Кол-во пустых - \" + str( variable.isna().sum() ) )\n",
    "    print( \"Кол-во непустых - \" + str( variable.count() ) )\n",
    "    print( \"Мода - \" + str( (variable.mode()[0])) + \"\\n\")\n",
    "    print( str( (variable.describe())))\n",
    "    \n",
    "    variable.value_counts().sort_index().plot(kind='bar')\n",
    "    plt.show()\n",
    "\n",
    "    # поиск выбросов\n",
    "    plt.boxplot(variable.dropna().astype(float)) \n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# функция для категориальной переменной\n",
    "def categorial_var(variable):\n",
    "    print( \"Кол-во пустых - \" + str( variable.isna().sum() ) )\n",
    "    print( \"Кол-во непустых - \" + str( variable.count() ) )\n",
    "    print( \"Уникальные значения - \" +  str( variable.dropna().unique() ) + \"\\n\")\n",
    "    print( \"Распределение значений \\n\" +  str( variable.value_counts() ) + \"\\n\")\n",
    "    print( \"Распределение значений в % \\n\" + str( variable.value_counts(normalize=True) * 100 ) + \"\\n\")\n",
    "    \n",
    "    print('Гистограмма распределения')\n",
    "    variable.value_counts().plot(kind='bar')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка Surgery (наличие операции)\n",
    "- 299 непустых значений, 1 пустых (не заполненное значение может быть из-за того, что нет информации была ли у лошади операция, можно присвоить новую категори Unknown)\n",
    "- Категориальная переменная из двух значений (1 - была операция, 2 нет было)\n",
    "- 180 лошадям сделали операцию, 119 нет\n",
    "- 60% делали операцию и 40% не делали\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "categorial_var(horse_data[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка Age\n",
    "- 300 непустых, 0 пустых\n",
    "- Категориальная переменная из двух значений (1 - взрослая, 9 - молодая < 9 месяцев)\n",
    "- 276 лошади взрослые, 24 молодые\n",
    "- 92% взрослые и 8% молодые"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "age = horse_data[1]\n",
    "\n",
    "categorial_var(age)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка Rectal Temperature\n",
    "- 60 пустых, 240 непустых значений (пустые значения могут быть из-за невозможности измерить температуру, лошадь может не дать этого сделать т.к. может быть гиперактивна и прочее)\n",
    "- среднее - 38.17\n",
    "- минимальная температура - 35.4\n",
    "- медиана - 38.2\n",
    "- максимум - 40.8\n",
    "- мода - 38.0\n",
    "\n",
    "- присутствуют выбросы: предположительно так развивается болезнь и у лошади может \"скакать\" темепература"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "temperature = horse_data[3]\n",
    "\n",
    "linear_var(temperature)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка Pulse\n",
    "- 24 пустых, 276 непустых значений (пустые из-за невозможности измерить пульс, трудное поведение лошади или потерянные данные)\n",
    "- среднее - 71.9\n",
    "- минимум - 30.0\n",
    "- медиана - 64.0\n",
    "- максимум - 184.0\n",
    "- мода - 48\n",
    "- есть выбросы, экстремально большие значение, скорее всего это крайние стадии болезней"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pulse = horse_data[4]\n",
    "linear_var(pulse)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка respiratory_rate (частота дыхания)\n",
    "- 58 пустых, 242 непустых значений (пустые возможно из-за нестабильности данного показателя, сложности или невозможности измерить данный показатель и потеря данных)\n",
    "- среднее - 30.4\n",
    "- минимум - 8\n",
    "- медиана - 24.5\n",
    "- максимум - 96\n",
    "- мода - 20\n",
    "\n",
    "есть выбросы, предполагается что данный показатель не очень стабилен, верен и из-за этого выбросы"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "respiratory_rate = horse_data[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "linear_var(respiratory_rate)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка peristalsis (показатель активности кишечника лошади)\n",
    "- Кол-во пустых - 44 (невозможность получить данные физически, возможно отсутствие необходимости этого показателя, потеря данных, можно присвоить новую категори Unknown)\n",
    "- Кол-во непустых - 256\n",
    "- Категориальная переменная из четырёх значений\n",
    "- Больше всего лошадей гипомобильных(50%)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "peristalsis = horse_data[11]\n",
    "\n",
    "categorial_var(peristalsis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка Total Protein\n",
    "- Кол-во пустых - 33 (возможно отсутствие необходимости этого показателя, возможности физически его получить, потеря данных)\n",
    "- Кол-во непустых - 267\n",
    "- Мода - 6.5\n",
    "- среднее - 24.5\n",
    "- медиана - 7.5\n",
    "- минимум - 3.3\n",
    "- медиана - 7.5\n",
    "- максимум - 89\n",
    "\n",
    "есть большие показатели, но их нельзя назвать выбросами"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "protein = horse_data[19]\n",
    "\n",
    "linear_var(protein)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Колонка Outcome (что произошло с лошадью)\n",
    "- Кол-во пустых - 1, кол-во непустых - 299 (пустое значение скорее всего означает неизвестность данного факта, т.е. невозможность определить, можно присвоить новую категори Unknown)\n",
    "- Категориальная переменная из трёх значений - [2 - была усыплена 3 - умерла 1- выжила]\n",
    "- Большая часть лошадей (59%) выжила"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "outcome = horse_data[22]\n",
    "\n",
    "categorial_var(outcome)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Формирование данных без пропусков"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# переименование колонок\n",
    "horse_data.columns\n",
    "\n",
    "col = [\"surgery\", 'Age', 'rectal temperature', 'pulse', 'respiratory rate', 'peristalsis', 'total protein', 'outcome']\n",
    "\n",
    "horse_data.columns = col"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# присвоение категориальным переменным нового показателя unknown\n",
    "horse_data['surgery'] = horse_data['surgery'].fillna('unknown')\n",
    "horse_data['peristalsis'] = horse_data['peristalsis'].fillna('unknown')\n",
    "horse_data['outcome'] = horse_data['outcome'].fillna('unknown')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# перевод в числовой формат\n",
    "horse_data['rectal temperature'] = horse_data['rectal temperature'].astype(float)\n",
    "horse_data['respiratory rate'] = horse_data['respiratory rate'].astype(float)\n",
    "horse_data['total protein'] = horse_data['total protein'].astype(float)\n",
    "horse_data['pulse'] = horse_data['pulse'].astype(float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# заполнение числовых данных интерполяцией и для невозможной интерполяции медианой\n",
    "numeric_cols = horse_data.select_dtypes(include=[np.number]).columns\n",
    "horse_data[numeric_cols] = horse_data[numeric_cols].interpolate()\n",
    "horse_data[numeric_cols] = horse_data[numeric_cols].fillna(horse_data[numeric_cols].median())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# проверка наличия пустых значений\n",
    "horse_data.isna().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
